{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Constructing Quantum Oracles for 3-Coloring Problems via NP-Reduction\n",
    "\n",
    "In this notebook, we demonstrate how to easily construct quantum oracles for [3-Coloring problems](https://en.wikipedia.org/wiki/Graph_coloring) using Qiskit Aqua via simple NP-Reduction to [SAT problems](https://en.wikipedia.org/wiki/Boolean_satisfiability_problem).\n",
    "\n",
    "3-Coloring is the decision problem of determining whether a graph's vertices can be colored using only 3 different colors s.t. no neighboring vertices share the same color. SAT is also a decision problem where we want to see if an \n",
    "given conjunctive normal form (CNF) has a satisfying assignment.\n",
    "\n",
    "Aqua already provides an `LogicExpressionOracle` class capable of building Quantum Oracle circuits from arbitrary logic expressions, with support for the [DIMACS CNF format](https://www.satcompetition.org/2009/format-benchmarks2009.html). So, to take advantage of that, we in this notebook aim to reduce 3-coloring problems to SAT problems, and then directly use the `LogicExpressionOracle` class to build the Oracle circuit.\n",
    "\n",
    "For 3-coloring problem instances, we work with the [DIMACS graph coloring format](https://mat.tepper.cmu.edu/COLOR/instances.html), which basically indicates the number of vertices and edges on the `'p edge'` line, followed by the `'e'` lines listing all edges (vertex pairs). For example we can have the following toy instance, and easily parse it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The input 3-coloring instance has 3 vertices and 3 edges: [[1, 2], [1, 3], [2, 3]].\n"
     ]
    }
   ],
   "source": [
    "three_coloring_instance = '''\n",
    "c This is an example DIMACS 3-coloring file\n",
    "p edge 3 3\n",
    "e 1 2\n",
    "e 1 3\n",
    "e 2 3\n",
    "'''\n",
    "\n",
    "import itertools\n",
    "\n",
    "def parse_3_coloring_instance(instance):\n",
    "    ls = [\n",
    "        l.strip() for l in instance.split('\\n')\n",
    "        if len(l) > 0 and not l.strip()[0] == 'c'\n",
    "    ]\n",
    "    headers = [l for l in ls if l[0] == 'p']\n",
    "    if len(headers) == 1:\n",
    "        p, sig, nv, ne = headers[0].split()\n",
    "        assert p == 'p' and sig == 'edge'\n",
    "    elif len(headers) > 1:\n",
    "        raise RuntimeError('Invalid input format for 3-Coloring.')\n",
    "    h_nv, h_ne = int(nv), int(ne)\n",
    "    edges = [[int(v) for v in l.split()[1:]] for l in ls if l[0] == 'e']\n",
    "    nv = len(set(list(itertools.chain.from_iterable(edges))))\n",
    "    ne = len(edges)\n",
    "    if not h_nv == nv:\n",
    "        print((\n",
    "            'Warning: inaccurate vertex count {} in header. '\n",
    "            'Actual vertex count is {}.'\n",
    "        ).format(h_nv, nv))\n",
    "    if not h_ne == ne:\n",
    "        print((\n",
    "            'Warning: inaccurate edge count {} in header. '\n",
    "            'Actual edge count is {}.'\n",
    "        ).format(h_ne, ne))\n",
    "\n",
    "    return nv, ne, edges\n",
    "\n",
    "nv, ne, edges = parse_3_coloring_instance(three_coloring_instance)\n",
    "\n",
    "print('The input 3-coloring instance has {} vertices and {} edges: {}.'.format(nv, ne, edges))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For any 3-coloring problem instance, we can use the following simple strategy to reduce it to a SAT problem:\n",
    "\n",
    "- For each vertex $v$, we create three boolean variables $v_r$, $v_g$, and $v_b$, corresponding to the vertex $v$ being of color red, green, and blue, respectively.\n",
    "- For each vertex $v$, we then have the constraint that it needs to be of one and only one color. Therefore, $v_r \\vee v_g \\vee v_b = True$, and $v_i \\wedge v_j = False$ for $i,j \\in \\{r,g,b\\}, i \\ne j$.\n",
    "- For each edge $(v, t)$, we have the constraint that they cannot both be of the same color. Therefore, $v_i \\wedge t_i = False$ for $i \\in \\{r, g, b\\}$.\n",
    "\n",
    "With this simple strategy and the help of the [De Morgan's Law](https://en.wikipedia.org/wiki/De_Morgan%27s_laws), we can carry out the reduction as follows."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The input 3-Coloring instance can be reduced to the following SAT instance:\n",
      "\n",
      "p cnf 9 21\n",
      "1 2 3 0\n",
      "-1 -2 0\n",
      "-1 -3 0\n",
      "-2 -3 0\n",
      "4 5 6 0\n",
      "-4 -5 0\n",
      "-4 -6 0\n",
      "-5 -6 0\n",
      "7 8 9 0\n",
      "-7 -8 0\n",
      "-7 -9 0\n",
      "-8 -9 0\n",
      "-1 -4 0\n",
      "-2 -5 0\n",
      "-3 -6 0\n",
      "-1 -7 0\n",
      "-2 -8 0\n",
      "-3 -9 0\n",
      "-4 -7 0\n",
      "-5 -8 0\n",
      "-6 -9 0\n"
     ]
    }
   ],
   "source": [
    "def reduce_to_sat(nv, ne, edges):\n",
    "\n",
    "    def _get_vertex_rgb(v):\n",
    "        return 3 * v - 2, 3 * v - 1, 3 * v\n",
    "\n",
    "    def _get_vertex_constraints(v):\n",
    "        r, g, b = _get_vertex_rgb(v)\n",
    "        return [\n",
    "            '{0} {1} {2} 0'.format(r, g, b),\n",
    "            '{} {} 0'.format(-r, -g),\n",
    "            '{} {} 0'.format(-r, -b),\n",
    "            '{} {} 0'.format(-g, -b)\n",
    "        ]\n",
    "\n",
    "    def _get_edge_constraints(v1, v2):\n",
    "        r1, g1, b1 = _get_vertex_rgb(v1)\n",
    "        r2, g2, b2 = _get_vertex_rgb(v2)\n",
    "        return [\n",
    "            '{0} {1} 0'.format(-r1, -r2),\n",
    "            '{0} {1} 0'.format(-g1, -g2),\n",
    "            '{0} {1} 0'.format(-b1, -b2)\n",
    "        ]\n",
    "\n",
    "    buf = list()\n",
    "    buf.append('p cnf {0} {1}'.format(nv * 3, nv * 4 + ne * 3))\n",
    "    buf.extend(itertools.chain.from_iterable([\n",
    "        _get_vertex_constraints(v)\n",
    "        for v in range(1, nv + 1)])\n",
    "    )\n",
    "    buf.extend(itertools.chain.from_iterable([\n",
    "        _get_edge_constraints(v1, v2)\n",
    "        for v1, v2 in edges])\n",
    "    )\n",
    "    return '\\n'.join(buf)\n",
    "\n",
    "sat_instance_cnf = reduce_to_sat(nv, ne, edges)\n",
    "print('The input 3-Coloring instance can be reduced to the following SAT instance:\\n\\n{}'.format(sat_instance_cnf))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we have successfully reduced the 3-Coloring problem instance to its equivalent SAT instance, we can go ahead using Aqua's `LogicExpressionOracle` to build the oracle and construct the quantum circuit."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 497.584x1831.28 with 1 Axes>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from qiskit.aqua.components.oracles import LogicalExpressionOracle\n",
    "\n",
    "oracle = LogicalExpressionOracle(expression=sat_instance_cnf)\n",
    "oracle.circuit.draw(output='mpl', scale=0.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
